#ifndef _ARRAY_LIST_MSG_H
#define _ARRAY_LIST_MSG_H

#include <cassert>
#include <QString>
#include <sstream>
#include <iomanip> 
#include <QList>
#include <QStringList>
#include "Main/qstringhandle.h"

//using namespace std;
//using namespace Const;

///////////////////////////////////////////////////////////////////////////////
//根据程世禄交易服务器类修改
///////////////////////////////////////////////////////////////////////////////
class ArrayListMsg
{
//	friend std::ostream& operator<<(std::ostream&, const ArrayListMsg&);
//	friend std::istream& operator>>(std::istream&, ArrayListMsg&);
private:
	typedef enum 
	{
		E_STRING,
		E_ARRAYLIST
	} eMsgType;

	typedef struct tagPosInfo
	{
		eMsgType eType;
		size_t nPos;
	} POS_INFO;

public:
	ArrayListMsg();
	~ArrayListMsg();	
	//----------------------------------------------------------------
	// 根据字符串进行初始化解析的构造函数
	// 输入参数： pStrMsg  需要进行解析的字符串指针
    ArrayListMsg(const QString& sStrMsg,int nLevel = 0);

	ArrayListMsg(const ArrayListMsg& oCopy);
	void operator=(const ArrayListMsg& oCopy);
	
	//----------------------------------------------------------------
	//函数功能：解析字符串
	//输入参数： pStrMsg  需要进行解析的字符串指针
	//返 回 值： 0：成功，其它失败
    int Parse(const QString& sStrMsg,int v_iLevel = 0);

	//----------------------------------------------------------------
	//函数功能：获得当前集合中的元素个数
	//输入参数：无
	//返 回 值：集合中的元素个数
    int size() const;

	//容器容量
//    int Capacity() const;

	//容器容量调整
	void Reserve(size_t nSize);

	//----------------------------------------------------------------
	//函数功能：将对象转换为字符串
	//输入参数：用于接收的字符串指针
	//返 回 值：无
    void   ToQString(QString& v_sOutMsg) const;
    QString ToQString() const;

	void clear();

	//----------------------------------------------------------------
    void AddValue(QVariant v)
    {
        m_sStrValues.push_back(v);
    }

    QVariant GetQValue(size_t nIndex)
    {
        return m_sStrValues[nIndex];
    }

	void AddValue(ArrayListMsg& aRec);

	//----------------------------------------------------------------
    QVariant GetStringEx(size_t nIndex)  const
	{
		assert(nIndex>=0 && nIndex < m_vecPosInfo.size() && m_vecPosInfo[nIndex].eType == E_STRING);
		assert(m_vecPosInfo[nIndex].nPos < m_sStrValues.size());

		return m_sStrValues[m_vecPosInfo[nIndex].nPos];
	}

    QVariant GetStringEx(size_t nRecIndex,size_t nEleIndex)  const
	{
		assert(nRecIndex>=0 && nRecIndex < m_vecPosInfo.size());
		assert(m_vecPosInfo[nRecIndex].eType == E_ARRAYLIST && m_vecPosInfo[nRecIndex].nPos < m_aListValues.size());

		return m_aListValues[m_vecPosInfo[nRecIndex].nPos].GetStringEx(nEleIndex);
	}

	ArrayListMsg GetValue(size_t nIndex) const;
	void GetValue(size_t nIndex,ArrayListMsg& aRec) const;
	//----------------------------------------------------------------

	void AddValue(size_t nIndex,ArrayListMsg& aRec);

	ArrayListMsg GetValue(size_t nRecIndex,size_t nEleIndex) const;

//    int ColumnSize();
private:
    void ToQString(QString& sOutMsg,int nIndex ) const;

	//用于保存元素为字符串的集合
    QList<QVariant>        m_sStrValues;
	//用于保存元素为ArrayListMsg对象的集合     特别说明：在两个集合中，只会有一个集合有元素数据
    QList<ArrayListMsg> m_aListValues;
	//字符串格式
    QString                m_sStrValue;

	int m_nLevel;
    QList<POS_INFO>	m_vecPosInfo;

};

#endif
